<?php
class TestContenidoKakoon extends TestPojos
{
    public function testInstancia()
    {
        $this->assert(($this->crea(null, null, null, null) instanceof ContenidoKakoon), "1. instancia");
    }

    public function testCrea()
    {
        $instancia      = $this->crea(1, "el tipo", "el titulo", 1);
        $identificador  = $instancia->consolida();
        $control1       = ($identificador > 0);

        $instancia  = null;
        $instancia  = $this->recupera($identificador);
        $control2   = ("el titulo" == $instancia->getPropiedad("titulo"));
        $control3   = ($instancia->getPropiedad(SeccionKakoon::CLAVE_PRIMARIA) == 1);
        $control4   = ($instancia->getPropiedad("posicion") == 1);

        $instancia  = null;
        $instancia  = $this->crea(1, "el tipo", "el titulo", 1);
        $control5   = Soporte::cadenaVacia($instancia->consolida());

        $instancia  = null;
        $instancia  = $this->recupera($identificador);
        $instancia->purga();
        $instancia = null;

        $this->assert($control1, "1. crea");
        $this->assert($control2, "2. crea");
        $this->assert($control3, "3. crea");
        $this->assert($control4, "4. crea");
        $this->assert($control5, "5. crea");
    }

    public function testGetElementoPorSector()
    {
        $instancia1     = $this->crea(1, "el tipo", "el titulo", 1);
        $identificador1 = $instancia1->consolida();
        $elemento1 = $this->creaElemento($instancia1->getIdentificador(), "sector1", ConstantesKakoon::ELEMENTO_LITERAL);
        $elemento1->registraValor("valor elemento 1 contenido 1");
        $elemento1->consolida();
        $elemento2 = $this->creaElemento($instancia1->getIdentificador(), "sector2", ConstantesKakoon::ELEMENTO_LITERAL);
        $elemento2->registraValor("valor elemento 2 contenido 1");
        $elemento2->consolida();
        
        $instancia2     = $this->crea(1, "el tipo", "otro titulo", 1);
        $identificador2 = $instancia2->consolida();
        $instancia2->consolida();
        $elemento3 = $this->creaElemento($instancia2->getIdentificador(), "sector1", ConstantesKakoon::ELEMENTO_LITERAL);
        $elemento3->registraValor("valor elemento 1 contenido 2");
        $elemento3->consolida();
        $elemento4 = $this->creaElemento($instancia2->getIdentificador(), "sector2", ConstantesKakoon::ELEMENTO_LITERAL);
        $elemento4->registraValor("valor elemento 2 contenido 2");
        $elemento4->consolida();
        
        $instancia1 = null;
        $instancia2 = null;
        $elemento1  = null;
        $elemento2  = null;
        $elemento3  = null;
        $elemento4  = null;
        $instancia1 = $this->recupera($identificador1);
        $instancia2 = $this->recupera($identificador2);
        $elemento1  = $instancia1->getElementoPorSector ("sector1");
        $elemento2  = $instancia1->getElementoPorSector ("sector2");
        $elemento3  = $instancia2->getElementoPorSector ("sector1");
        $elemento4  = $instancia2->getElementoPorSector ("sector2");
        $elemento5  = $instancia1->getElementoPorSector ("sectornulo");
        $control1 = ($elemento1 instanceof ElementoKakoon);
        $control2 = ($elemento2 instanceof ElementoKakoon);
        $control3 = ($elemento3 instanceof ElementoKakoon);
        $control4 = ($elemento4 instanceof ElementoKakoon);
        $control5 = (is_null ($elemento5));
        $control6 = ("valor elemento 1 contenido 1" == $elemento1->recuperaValor());
        $control7 = ("valor elemento 2 contenido 1" == $elemento2->recuperaValor());
        $control8 = ("valor elemento 1 contenido 2" == $elemento3->recuperaValor());
        $control9 = ("valor elemento 2 contenido 2" == $elemento4->recuperaValor());

        $instancia1->purga();
        $instancia2->purga();
        $elemento1->purga();
        $elemento2->purga();
        $elemento3->purga();
        $elemento4->purga();
        
        $this->assert($control1, "1. getElementoPorSector");
        $this->assert($control2, "2. getElementoPorSector");
        $this->assert($control3, "3. getElementoPorSector");
        $this->assert($control4, "4. getElementoPorSector");
        $this->assert($control5, "5. getElementoPorSector");
        $this->assert($control6, "6. getElementoPorSector");
        $this->assert($control7, "7. getElementoPorSector");
        $this->assert($control8, "8. getElementoPorSector");
        $this->assert($control9, "9. getElementoPorSector");
    }

    public function testRegistraPosicion()
    {
        $instancia1 = $this->crea(1, "el tipo", "el titulo", 1);
        $instancia1->registraPosicion();
        $identificador1 = $instancia1->consolida();

        $instancia2 = $this->crea(1, "el tipo", "otro titulo", 1);
        $instancia2->registraPosicion();
        $identificador2 = $instancia2->consolida();

        $instancia1 = null;
        $instancia2 = null;
        $instancia1 = new ContenidoKakoon($this->accesoBD, $identificador1);
        $instancia2 = new ContenidoKakoon($this->accesoBD, $identificador2);

        $control1 = ($instancia1->getIdentificador() == $identificador1);
        $control2 = ($instancia2->getIdentificador() == $identificador2);
        $control3 = ($instancia1->getPropiedad("posicion") == 1);
        $control4 = ($instancia2->getPropiedad("posicion") == 2);

        $instancia1->purga();

        $instancia3 = $this->crea(1, "el tipo", "mas titulo", 1);
        $instancia3->registraPosicion();

        $control5 = ($instancia3->getPropiedad("posicion") == 3);

        $instancia2->purga();
        $instancia3->purga();

        $this->assert ($control1, "1. registraPosicion");
        $this->assert ($control2, "2. registraPosicion");
        $this->assert ($control3, "3. registraPosicion");
        $this->assert ($control4, "4. registraPosicion");
        $this->assert ($control5, "5. registraPosicion");
    }

    public function testPosicionamiento()
    {
        $instancia1 = $this->crea(1, "el tipo", "el titulo", 1);
        $instancia1->registraPosicion();
        $identificador1 = $instancia1->consolida();

        $instancia2 = $this->crea(1, "el tipo", "otro titulo", 1);
        $instancia2->registraPosicion();
        $identificador2 = $instancia2->consolida();

        $instancia3 = $this->crea(1, "el tipo", "mas titulo", 1);
        $instancia3->registraPosicion();
        $identificador3 = $instancia3->consolida();

        $instancia1 = null;
        $instancia2 = null;
        $instancia3 = null;
        $instancia1 = new ContenidoKakoon($this->accesoBD, $identificador1);
        $instancia2 = new ContenidoKakoon($this->accesoBD, $identificador2);
        $instancia3 = new ContenidoKakoon($this->accesoBD, $identificador3);

        $control1 = ($instancia1->getIdentificador() == $identificador1);
        $control2 = ($instancia2->getIdentificador() == $identificador2);
        $control3 = ($instancia3->getIdentificador() == $identificador3);
        $control4 = ($instancia1->getPropiedad("posicion") == 1);
        $control5 = ($instancia2->getPropiedad("posicion") == 2);
        $control6 = ($instancia3->getPropiedad("posicion") == 3);

        $instancia1->sube();
        $instancia2 = null;
        $instancia2 = new ContenidoKakoon($this->accesoBD, $identificador2);

        $control7 = ($instancia1->getPropiedad("posicion") == 2);
        $control8 = ($instancia2->getPropiedad("posicion") == 1);

        $instancia3->baja();
        $instancia1 = null;
        $instancia1 = new ContenidoKakoon($this->accesoBD, $identificador1);

        $control9  = ($instancia3->getPropiedad("posicion") == 2);
        $control10 = ($instancia1->getPropiedad("posicion") == 3);

        $instancia2->sube();
        $instancia3 = null;
        $instancia3 = new ContenidoKakoon($this->accesoBD, $identificador3);

        $control11 = ($instancia3->getPropiedad("posicion") == 1);
        $control12 = ($instancia2->getPropiedad("posicion") == 2);

        $this->assert ($control1,  "1. posicionamiento");
        $this->assert ($control2,  "2. posicionamiento");
        $this->assert ($control3,  "3. posicionamiento");
        $this->assert ($control4,  "4. posicionamiento");
        $this->assert ($control5,  "5. posicionamiento");
        $this->assert ($control6,  "6. posicionamiento");
        $this->assert ($control7,  "7. posicionamiento");
        $this->assert ($control8,  "8. posicionamiento");
        $this->assert ($control9,  "9. posicionamiento");
        $this->assert ($control10, "10. posicionamiento");
        $this->assert ($control11, "11. posicionamiento");
        $this->assert ($control12, "12. posicionamiento");

        $instancia1->purga();
        $instancia2->purga();
        $instancia3->purga();
    }

    public function setUp()
    {
        $accesoBD   = new AccesoBD($GLOBALS["ACCESOBD_DATOS"]);
        $instancia  = new ContenidoKakoon($accesoBD);
        $instancia->borraTabla();
        $instancia->creaTabla();

        $instancia  = new ElementoKakoon($accesoBD);
        $instancia->borraTabla();
        $instancia->creaTabla();
    }

    private function crea ($seccion, $tipo, $titulo, $posicion)
    {
        $retorno = new ContenidoKakoon($this->accesoBD);

        $retorno->setPropiedad(SeccionKakoon::CLAVE_PRIMARIA, $seccion);
        $retorno->setPropiedad("tipo",                        $tipo);
        $retorno->setPropiedad("titulo",                      $titulo);
        $retorno->setPropiedad("posicion",                    $posicion);

        return $retorno;
    }

    private function creaElemento ($contenido, $sector, $naturaleza)
    {
        $retorno = new ElementoKakoon($this->accesoBD);

        $retorno->setPropiedad(ContenidoKakoon::CLAVE_PRIMARIA, $contenido);
        $retorno->setPropiedad("sector",                        $sector);
        $retorno->setPropiedad("naturaleza",                    $naturaleza);
    
        return $retorno;
    }
    
    private function recupera ($identificador)
    {
        return new ContenidoKakoon($this->accesoBD, $identificador);
    }
}
?>